#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 1
#include <assert.h>
#include <windows.h>
#include <stdbool.h> 
#include <locale.h>
#define POS_X 24
#define POS_Y 5
#define WALL L'■'
#define BODY L'●'
#define FOOD L'★'
#include <time.h>
#define KEY_PRESS(vk) (((GetAsyncKeyState(vk))&1)?1:0)
#pragma once

//蛇身节点
typedef struct SnakeNode {
    int x;
    int y;
    struct SnakeNode* next;
}SnakeNode, * pSnakeNode;

//蛇的方向
enum DIRECTION {
    UP = 1,
    DOWN,
    LEFT,
    RIGHT,
};
//游戏状态
enum GAME_STATE {
    OK, //正常
    KILL_BY_WALL, //撞墙
    KILL_BY_SELF, //撞倒自己
    END_NORMAL, //正常结束
};
//贪吃蛇
typedef struct Snake {
    pSnakeNode _pSnake; //蛇头指针
    pSnakeNode _pFood; //食物指针
    enum DIRECTION _dir; //蛇的方向
    enum GAME_STATE _state; //游戏状态
    int _food_weight; //食物分数
    int _score; //总成绩
    int _sleep_time; //休息时间，时间长移动慢。
}Snake,*pSnake;
//设置控制台光标初始位置
void SetPos(short x, short y);
//设置控制台光标状态
void SetState(int size, BOOL state);
//游戏初始化
void GameStart(pSnake ps);
//游戏欢迎界面
void WelcomeToGame();
//创建地图
void CreateMap();
//初始化蛇
void InitSnake(pSnake ps);
//设置食物
void CreateFood(pSnake ps);
//游戏运行逻辑
void GameRun(pSnake ps);
//帮助提示打印
void PrintHelpInfo();
//游戏暂停
void pause();
//蛇移动
void SnakeMove(pSnake ps);
//判断下一个坐标是不是食物
int NextIsFood(pSnakeNode pnext, pSnake ps);
//吃到食物
void EatFood(pSnakeNode pnext, pSnake ps);
//没有吃到食物
void NoFood(pSnakeNode pnext, pSnake ps);
//游戏结束
void GameEnd(pSnake ps);
//装墙判断
void KillByWall(pSnake ps);
//撞身体判断
void KillBySelf(pSnake ps);